package com.microservice.salmon.weixin.store;

import com.microservice.salmon.weixin.domain.ticket.Ticket;

import java.time.LocalDateTime;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * <p>
 *  微信AccessToken的存储，因为微信的token请求次数有限制，过期时间为 7200s
 *  token的存储方式有很多 例如 session  redis 等等， 如果放到session中注意分布式的问题
 *  默认采用Map的方式进行存储， 可以扩充到redis中进行存储
 * </p>
 *
 * @author 王洪庆 2018-12-11 11:37
 */
public class DefaultWeiXinTicketStore implements WeiXinTicketStore {

    private final static Map<String, Ticket> store = new ConcurrentHashMap<>();

    /**
     * 从存储里面获取到令牌,如果令牌过期 返回 null，此时需要重新进行获取
     * @param key 微信 APP ID
     * @return 返回令牌
     */
    @Override
    public Ticket getWeiXinTicketFromStore(String key) {
        Ticket ticket = store.get(key);
        if(ticket != null) {
            LocalDateTime now = LocalDateTime.now();
            //如果当前时间在过期时间之前，表示没过期
            if(now.isBefore(ticket.getExpireDateTime())) {
                return ticket;
            }
        }
        return null;
    }

    /**
     * 存储微信AccessToken
     * @param key 微信APP ID
     * @param ticket 请求到的令牌
     */
    @Override
    public void storeWeiXinTicket(String key, Ticket ticket) {
        ticket.setExpireDateTime(LocalDateTime.now().plusSeconds(ticket.getExpiresIn() - 200));
        store.put(key, ticket);
    }
}
